package metier.jdbc.affectation;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JOptionPane;

import metier.AffectEleve;
import metier.Eleve;
import configuration.MessageAppli;

public class AffectEleveJdbc {
/**
 * Permet d'ajouter une affectation à un eleve.
 * @param c
 * @param idAffect
 * @param idEleve
 * @param uneDateDebutAff
 * @param uneDateFinAff
 * @return boolean
 */	
public static boolean ajouter(Connection c, AffectEleve uneAffectationEleve) {
	//Préparer la requete sql 
	//Retourne un entier égal à 1 
	//Si l’insertion en base de données a été réalisée
		
	int res = 0;
	try
	{
		PreparedStatement ps=c.prepareStatement("INSERT INTO affecteleve (idaffect, ideleve, datedebutaff, datefinaff) VALUES (?,?,?,?)");
			
		//Affecter les values correspondant aux colonnes
		ps.setInt(1, uneAffectationEleve.getIdAffect());
		ps.setInt(2, uneAffectationEleve.getIdEleve());
		ps.setDate(3, new java.sql.Date(uneAffectationEleve.getDateDebutAff().getTime()));
		ps.setDate(4, new java.sql.Date(uneAffectationEleve.getDateFinAff().getTime()));
		
		res = ps.executeUpdate();
		ps.close();
	}
	catch (SQLException e)
	{
		e.printStackTrace();
		JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
		MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
	}
	return res==1;
}

/**
 * Permet de modifier l'affectation d'un eleve.
 * @param c
 * @param uneAffectationEleve
 * @param idEleve
 * @return boolean
 */
public static boolean modifier(Connection c, AffectEleve uneAffectationEleve) {
	//Préparer la requete sql 
	//Retourne un entier égal à 1 
	//Si la modification en base de données a été réalisée
		
	int res = 0;
	if ( uneAffectationEleve.getIdAffect() != null )
	{
		try
		{
			PreparedStatement ps=c.prepareStatement(
			"UPDATE affecteleve set datedebutaff = ?, datefinaff = ? WHERE idaffect = ? AND ideleve= ?");
				
			//Affecter les values correspondant aux colonnes
			ps.setDate(1, new java.sql.Date(uneAffectationEleve.getDateDebutAff().getTime()));
			ps.setDate(2, new java.sql.Date(uneAffectationEleve.getDateFinAff().getTime()));
			ps.setInt(3, uneAffectationEleve.getIdAffect());
			ps.setInt(4, uneAffectationEleve.getIdEleve());
			
			res = ps.executeUpdate();
			ps.close();
			return res == 1;
		}
		catch (SQLException e)
		{
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
	}
	return false;	
}

/**
 * Permet de modifier l'affectation d'un eleve.
 * @param c
 * @param uneAffectationEleve
 * @param nouvIdAffect
 * @param nouvDateDeb
 * @param nouvDateFin
 * @return boolean
 */
public static boolean modifierSaufIdEleve(Connection c, AffectEleve uneAffectationEleve, int nouvIdAffect, Date nouvDateDeb, Date nouvDateFin ) {
	//Préparer la requete sql 
	//Retourne un entier égal à 1 
	//Si la modification en base de données a été réalisée
		
	int res = 0;
	if ( uneAffectationEleve.getIdAffect() != null )
	{
		try
		{
			PreparedStatement ps=c.prepareStatement(
			"UPDATE affecteleve set idaffect = ?, datedebutaff = ?, datefinaff = ? WHERE idaffect = ? AND ideleve= ? AND datedebutaff = ? AND datefinaff = ?");
				
			//Affecter les values correspondant aux colonnes
			ps.setInt(1, nouvIdAffect);
			ps.setDate(2, new java.sql.Date(nouvDateDeb.getTime()));
			ps.setDate(3, new java.sql.Date(nouvDateFin.getTime()));
			ps.setInt(4, uneAffectationEleve.getIdAffect());
			ps.setInt(5, uneAffectationEleve.getIdEleve());
			ps.setDate(6, new java.sql.Date(uneAffectationEleve.getDateDebutAff().getTime()));
			ps.setDate(7, new java.sql.Date(uneAffectationEleve.getDateFinAff().getTime()));

			res = ps.executeUpdate();
			ps.close();
			return res == 1;
		}
		catch (SQLException e)
		{
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
	}
	return false;	
}

/**
 * Permet de supprimer l'affectation d'un eleve.
 * @param c
 * @param uneAffectation
 * @return boolean
 */
public static boolean supprimer(Connection c, AffectEleve uneAffectationEleve) {
	//Préparer la requete sql 
	//Retourne un entier égal à 1 
	//Si la suppression en base de données a été réalisée
		
	int res = 0;
	try
	{
		PreparedStatement ps=c.prepareStatement("DELETE FROM affecteleve WHERE idaffect = ? AND ideleve = ? AND datedebutaff = ? AND datefinaff = ?");
			
		//Affecter les values correspondant aux colonnes
		ps.setInt(1, uneAffectationEleve.getIdAffect());
		ps.setInt(2, uneAffectationEleve.getIdEleve());
		ps.setDate(3, new java.sql.Date(uneAffectationEleve.getDateDebutAff().getTime()));
		ps.setDate(4, new java.sql.Date(uneAffectationEleve.getDateFinAff().getTime()));
		
		res = ps.executeUpdate();
		ps.close();
		return res == 1;
	}
	catch (SQLException e)
	{
		e.printStackTrace();
		JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
				MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
	}
	return false;
}

/**
 * @param c
 * @param idAffect
 * @param idEleve
 * @param dateDebAff
 * @param dateFinAff
 * @return
 */
public static boolean ExisteAffectEleve(Connection c, Integer idAffect, Integer idEleve,
		java.util.Date dateDebAff, java.util.Date dateFinAff){
	AffectEleve uneAffectEleve=null;
	
	if(idAffect!=null && idEleve!=null && dateDebAff!=null && dateFinAff !=null)
	{
		try
		{
			PreparedStatement ps = c.prepareStatement("SELECT * FROM affecteleve WHERE idaffect=? AND ideleve=? AND datedebutaff=? AND datefinaff=?");
			ps.setInt(1, idAffect);
			ps.setInt(2, idEleve);
			ps.setDate(3, new java.sql.Date(dateDebAff.getTime()));
			ps.setDate(4, new java.sql.Date(dateFinAff.getTime()));
			ResultSet res = ps.executeQuery();
			
			if(res.next())
			{
				uneAffectEleve = new AffectEleve(res.getInt("idaffect"),res.getInt("ideleve"),res.getDate("datedebutaff"),res.getDate("datefinaff"));
			}
			ps.close();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
				MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
	}
	if(uneAffectEleve==null)
		return false;
	else
	return true;
}

/**
 * Retourne les affections d'un eleve.
 * @param c
 * @param idEleve
 * @return
 */
public static ArrayList<AffectEleve> getListeAffectEleve(Connection c, int idEleve){
	ArrayList<AffectEleve> lAffectEleve = new ArrayList<AffectEleve>();
	try
	{
		PreparedStatement ps = c.prepareStatement("SELECT * FROM affecteleve WHERE ideleve=" + idEleve);
		ResultSet res = ps.executeQuery();
		while(res.next()){
			lAffectEleve.add(new AffectEleve(res.getInt("idaffect"),res.getInt("ideleve"),res.getDate("datedebutaff"),res.getDate("datefinaff")));
		}
		ps.close();
	}
	catch (SQLException e)
	{
		e.printStackTrace();
		JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
			MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
	}
	
	return lAffectEleve;
}


public static void main(String[] args) {
	
	try
	{
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
		Date date1F = null;
		String date1 = "25/07/2012";
		date1F = simpleDateFormat.parse(date1);
		
		Date date2F = null;
		String date2 = "25/08/2012";
		date2F = simpleDateFormat.parse(date2);
		
		AffectEleve uneAffectationEleve = new AffectEleve(1, 1,date1F , date2F);
		ajouter(jdbc.Connexion.getConnexion(), uneAffectationEleve);
		System.out.println("Ajout...");
		
		Date date3F = null;
		String date3="25/09/2012";
		date3F = simpleDateFormat.parse(date3);
		
		uneAffectationEleve.setDateFinAff(date3F);
		
		modifier(jdbc.Connexion.getConnexion(), uneAffectationEleve);
		System.out.println("Modification...");
		supprimer(jdbc.Connexion.getConnexion(), uneAffectationEleve);
		System.out.println("Suppression...");
		
	}
	catch (ParseException e) {
		e.printStackTrace();
	}
	

	
}
/**
 * Permet de supprimer de l'historique d'un eleve.
 * @param c
 * @param eleve
 * @return
 */
public static boolean supprimerHistorique(Connection c, Eleve eleve) {
	try {
		PreparedStatement ps=c.prepareStatement("DELETE FROM affecteleve WHERE idEleve = " + eleve.getIdEleve());
		ps.executeUpdate();
		ps.close();
		return true;
	} catch (SQLException e) {
		e.printStackTrace();
		JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
				MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
	}
	return false;
}
}

